#include <stdio.h>          // 标准输入输出
#include <unistd.h>     // POSIX标准接口
#include <stdlib.h>         // 标准函数库
#include <string.h>         // 字符串处理(操作字符数组)

#include "ohos_init.h"      // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h"      // CMSIS-RTOS API V2

#include "wifi_connecter.h"     // easy wifi (station模式)
#include "mqtt_task.h"          // MQTT接口

#include "adxl.h"
// 平台接入地址
#define PARAM_SERVER_ADDR "192.168.31.210"

// 端口号，MQTT协议对应的是1883
#define PARAM_SERVER_PORT "1883"

// 客户端ID
#define PARAM_CLIENT_ID "Pegasus005"

// 用户名
#define PARAM_USER_NAME "anran"

// 密码
#define PARAM_PASSWORD "123456789"

#define I2C_ID 0 
#define BAUDRATE 9600

// 定义一系列宏，用于标识SSID、密码、加密方式等，请根据实际情况修改
#define PARAM_HOTSPOT_SSID "jit-OpenAtom"           // AP名称
#define PARAM_HOTSPOT_PSK "jitopenatom"      // AP密码
#define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 安全类型，定义在wifi_device_config.h中

// 主线程函数
static void adxl(void *arg)
{
    (void)arg;
    //连接AP
    WifiDeviceConfig config = {0};                      // 定义热点配置
    strcpy(config.ssid, PARAM_HOTSPOT_SSID);            // 设置热点配置中的SSID
    strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);     // 设置热点配置中的密码
    config.securityType = PARAM_HOTSPOT_TYPE;           // 设置热点配置中的加密方式
    osDelay(10);
    int netId = ConnectToHotspot(&config);              // 连接到热点
    if (netId < 0)                                      // 检查是否成功连接到热点
    {
        printf("Connect to AP failed!\r\n");
        return;
    }

    // 初始化并启动MQTT任务，连接MQTT服务器
    MqttTaskInit();                                                     // 初始化并启动MQTT任务
    const char *host = PARAM_SERVER_ADDR;                               // MQTT服务器IP地址
    unsigned short port = atoi(PARAM_SERVER_PORT);                      // MQTT服务器端口
    const char *clientId = PARAM_CLIENT_ID;                             // MQTT客户端ID
    const char *username = PARAM_USER_NAME;                             // MQTT服务器用户名
    const char *password = PARAM_PASSWORD;                              // MQTT服务器密码
    if (MqttTaskConnect(host, port, clientId, username, password) != 0) // 连接MQTT服务器
    {
        printf("Connect to MQTT server failed!\r\n");
        return;
    }

    // 订阅主题
    char *stopic = "Pegasus002/act2";                                           // 主题
    int rc = MqttTaskSubscribe(stopic);                                                 // 订阅主题
    if (rc != 0)                                                                        // 检查是否成功订阅主题
    {
        printf("MQTT Subscribe failed!\r\n");
        return;
    }
    printf("MQTT Subscribe OK\r\n");

    

    char *ptopic_adxl="Capsule/report/adxl345";//主题

    setupADXL345();


    //InitTempHumiSensor();
    while(1)
    {
        int16_t x=0,y=0,z=0;
        char payload_adxl[300] = {0};                                         // 消息内容

        readADXL345(&x,&y,&z);
        snprintf(payload_adxl, sizeof(payload_adxl),
                 "{\"device_id\":\"Pegasus0001\", \"X\":%d,\"Y\":%d,\"Z\":%d}",
                 x,y,z);                                        // 获取传感器数据
        
        rc = MqttTaskPublish(ptopic_adxl, payload_adxl);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        else
            printf("MQTT Publish OK\r\n");                              // 输出发布成功信息

        
        printf("X: %d,Y: %d,Z: %d\n",x,y,z);
        usleep(10*1000);


        osDelay(200);
    }
}

// 入口函数
static void ADXLDemo(void)
{
    // 定义线程属性
    osThreadAttr_t attr;
    attr.name = "ADXL345Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal;

    // 创建线程(并将其加入活跃线程组中)
    if (osThreadNew(adxl, NULL, &attr) == NULL)
    {
        printf("[%s] Falied to create ADXLTask!\n", __func__);
    }
}

// 运行入口函数
SYS_RUN(ADXLDemo);